/*******************************************************************************
 * Copyright (c) 2007, 2014 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.internal.ui.search;

import org.eclipse.jdt.core.search.IJavaSearchConstants;
import org.eclipse.jdt.ui.JavaElementLabels;

import java.util.ArrayList;

public class MatchLocations {

//	public static class MatchLocationSelectionDialog extends TrayDialog {
//
//		private final ArrayList<Button> fButtons;
//		private final int fSearchFor;
//		private int fCurrentSelection;
//
//		public MatchLocationSelectionDialog(Shell parent, int initialSelection, int searchFor) {
//			super(parent);
//			fSearchFor= searchFor;
//			fButtons= new ArrayList<Button>();
//			fCurrentSelection= initialSelection;
//		}
//
//		/* (non-Javadoc)
//		 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
//		 */
//		@Override
//		protected void configureShell(Shell shell) {
//			super.configureShell(shell);
//			shell.setText(SearchMessages.MatchLocations_dialog_title);
//		}
//
//		/* (non-Javadoc)
//		 * @see org.eclipse.jface.dialogs.Dialog#isResizable()
//		 */
//		@Override
//		protected boolean isResizable() {
//			return true;
//		}
//
//		/* (non-Javadoc)
//		 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
//		 */
//		@Override
//		protected Control createDialogArea(Composite parent) {
//			Composite contents= (Composite) super.createDialogArea(parent);
//			GridLayout layout= (GridLayout) contents.getLayout();
//			layout.numColumns= 2;
//			layout.makeColumnsEqualWidth= true;
//
//			Label label= new Label(contents, SWT.NONE);
//			label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1));
//			label.setText(SearchMessages.MatchLocations_dialog_description);
//
//			if (fSearchFor == IJavaSearchConstants.TYPE) {
//				createTypeMatchLocationsControls(contents);
//			} else {
//				createMethodFieldMatchLocationsControls(contents);
//			}
//
//			Composite buttonComposite= new Composite(contents, SWT.NONE);
//			buttonComposite.setLayoutData(new GridData(SWT.LEFT, SWT.BEGINNING, true, true, 2, 1));
//			GridLayout blayout= new GridLayout(2, false);
//			blayout.marginWidth= 0;
//			blayout.marginHeight= 0;
//			buttonComposite.setLayout(blayout);
//
//			Button selectAllButton= new Button(buttonComposite, SWT.PUSH);
//			selectAllButton.setLayoutData(new GridData());
//			selectAllButton.setText(SearchMessages.MatchLocations_select_all_button_label);
//			selectAllButton.addSelectionListener(new SelectionAdapter() {
//				@Override
//				public void widgetDefaultSelected(SelectionEvent e) {
//					performSelectAction(true);
//				}
//				@Override
//				public void widgetSelected(SelectionEvent e) {
//					performSelectAction(true);
//				}
//			});
//
//			SWTUtil.setButtonDimensionHint(selectAllButton);
//
//			Button deselectAllButton= new Button(buttonComposite, SWT.PUSH);
//			deselectAllButton.setLayoutData(new GridData());
//			deselectAllButton.setText(SearchMessages.MatchLocations_deselect_all_button_label);
//			deselectAllButton.addSelectionListener(new SelectionAdapter() {
//				@Override
//				public void widgetDefaultSelected(SelectionEvent e) {
//					performSelectAction(false);
//				}
//				@Override
//				public void widgetSelected(SelectionEvent e) {
//					performSelectAction(false);
//				}
//			});
//			SWTUtil.setButtonDimensionHint(deselectAllButton);
//
//			Dialog.applyDialogFont(contents);
//
//			return contents;
//		}
//
//		private void createMethodFieldMatchLocationsControls(Composite contents) {
//
//			Composite composite= new Composite(contents, SWT.NONE);
//			GridData gd= new GridData(SWT.LEFT, SWT.BEGINNING, true, true, 2, 1);
//			gd.minimumWidth= convertHorizontalDLUsToPixels(200);
//			composite.setLayoutData(gd);
//			GridLayout blayout= new GridLayout(1, false);
//			blayout.marginWidth= 0;
//			blayout.marginHeight= 0;
//			composite.setLayout(blayout);
//
//			if (fSearchFor == IJavaSearchConstants.METHOD || fSearchFor == IJavaSearchConstants.FIELD) {
//				createButton(composite, SearchMessages.MatchLocations_this_label, IJavaSearchConstants.THIS_REFERENCE);
//				createButton(composite, SearchMessages.MatchLocations_implicit_this_label, IJavaSearchConstants.IMPLICIT_THIS_REFERENCE);
//
//				createButton(composite, SearchMessages.MatchLocations_super_label, IJavaSearchConstants.SUPER_REFERENCE);
//				createButton(composite, SearchMessages.MatchLocations_qualified_label, IJavaSearchConstants.QUALIFIED_REFERENCE);
//			}
//
//			if (fSearchFor == IJavaSearchConstants.METHOD || fSearchFor == IJavaSearchConstants.CONSTRUCTOR) {
//				createButton(composite, SearchMessages.MatchLocations_method_reference_label, IJavaSearchConstants.METHOD_REFERENCE_EXPRESSION);
//			}
//		}
//
//		private void createTypeMatchLocationsControls(Composite contents) {
//			Group group= new Group(contents, SWT.NONE);
//			group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 2));
//			group.setLayout(new GridLayout(1, false));
//			group.setText(SearchMessages.MatchLocations_declaration_group_label);
//
//			createButton(group, SearchMessages.MatchLocations_imports_label, IJavaSearchConstants.IMPORT_DECLARATION_TYPE_REFERENCE);
//			createButton(group, SearchMessages.MatchLocations_super_types_label, IJavaSearchConstants.SUPERTYPE_TYPE_REFERENCE);
//			addSeparator(group);
//
//			createButton(group, SearchMessages.MatchLocations_annotations_label , IJavaSearchConstants.ANNOTATION_TYPE_REFERENCE);
//			addSeparator(group);
//
//			createButton(group, SearchMessages.MatchLocations_field_types_label, IJavaSearchConstants.FIELD_DECLARATION_TYPE_REFERENCE);
//			createButton(group, SearchMessages.MatchLocations_local_types_label, IJavaSearchConstants.LOCAL_VARIABLE_DECLARATION_TYPE_REFERENCE);
//			addSeparator(group);
//
//			createButton(group, SearchMessages.MatchLocations_method_types_label, IJavaSearchConstants.RETURN_TYPE_REFERENCE);
//			createButton(group, SearchMessages.MatchLocations_parameter_types_label, IJavaSearchConstants.PARAMETER_DECLARATION_TYPE_REFERENCE);
//			createButton(group, SearchMessages.MatchLocations_thrown_exceptions_label, IJavaSearchConstants.THROWS_CLAUSE_TYPE_REFERENCE);
//
//			Group ptGroup= new Group(contents, SWT.NONE);
//			ptGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
//			ptGroup.setLayout(new GridLayout(1, false));
//			ptGroup.setText(SearchMessages.MatchLocations_in_parameterized_types_group_label);
//
//			createButton(ptGroup, SearchMessages.MatchLocations_type_parameter_bounds_label, IJavaSearchConstants.TYPE_VARIABLE_BOUND_TYPE_REFERENCE);
//			createButton(ptGroup, SearchMessages.MatchLocations_wildcard_bounds_label, IJavaSearchConstants.WILDCARD_BOUND_TYPE_REFERENCE);
//
//			createButton(ptGroup, SearchMessages.MatchLocations_type_arguments_label, IJavaSearchConstants.TYPE_ARGUMENT_TYPE_REFERENCE);
//
//			Group statementGroup= new Group(contents, SWT.NONE);
//			statementGroup.setLayoutData(new GridData(SWT.FILL, SWT.END, true, false));
//			statementGroup.setLayout(new GridLayout(1, false));
//			statementGroup.setText(SearchMessages.MatchLocations_expression_group_label);
//
//			createButton(statementGroup, SearchMessages.MatchLocations_casts_label, IJavaSearchConstants.CAST_TYPE_REFERENCE);
//			createButton(statementGroup, SearchMessages.MatchLocations_catch_clauses_label, IJavaSearchConstants.CATCH_TYPE_REFERENCE);
//			addSeparator(statementGroup);
//			createButton(statementGroup, SearchMessages.MatchLocations_class_instance_label, IJavaSearchConstants.CLASS_INSTANCE_CREATION_TYPE_REFERENCE);
//			createButton(statementGroup, SearchMessages.MatchLocations_instanceof_label, IJavaSearchConstants.INSTANCEOF_TYPE_REFERENCE);
//		}
//
//		protected final void performSelectAction(boolean selectAll) {
//			for (int i= 0; i < fButtons.size(); i++) {
//				Button button= fButtons.get(i);
//				button.setSelection(selectAll);
//			}
//			validateSettings();
//		}
//
//		private void addSeparator(Composite parent) {
//			Label label= new Label(parent, SWT.NONE);
//			GridData data= new GridData();
//			data.heightHint= 4;
//			label.setLayoutData(data);
//		}
//
//
//		private Button createButton(Composite parent, String text, int data) {
//			boolean isSelected= (fCurrentSelection & data) != 0;
//
//			Button button= new Button(parent, SWT.CHECK);
//			button.setText(text);
//			button.setData(new Integer(data));
//			button.setLayoutData(new GridData());
//			button.setSelection(isSelected);
//			button.addSelectionListener(new SelectionAdapter() {
//				@Override
//				public void widgetDefaultSelected(SelectionEvent e) {
//					performOptionChanged();
//				}
//				@Override
//				public void widgetSelected(SelectionEvent e) {
//					widgetDefaultSelected(e);
//				}
//			});
//
//
//			fButtons.add(button);
//
//			return button;
//		}
//
//		private int getIntValue(Button button) {
//			Integer bData= (Integer) button.getData();
//			if (bData != null) {
//				return bData.intValue();
//			}
//			return 0;
//		}
//
//		protected final void performOptionChanged() {
//			validateSettings();
//		}
//
//		private void validateSettings() {
//			int selected= 0;
//			for (int i= 0; i < fButtons.size(); i++) {
//				Button button= fButtons.get(i);
//				if (button.getSelection()) {
//					selected |= getIntValue(button);
//				}
//			}
//			fCurrentSelection= selected;
//
//			getButton(IDialogConstants.OK_ID).setEnabled(selected != 0);
//		}
//
//		public int getCurrentSelection() {
//			return fCurrentSelection;
//		}
//	}

    public static String getMatchLocationDescription(int locations, int entryLimit) {
        int nOptions = getNumberOfSelectedSettings(locations, entryLimit);
        if (nOptions > entryLimit) {
            return SearchMessages.MatchLocations_match_locations_description;
        }
        ArrayList<String> args = new ArrayList<String>(3);
        if (isSet(locations, IJavaSearchConstants.IMPORT_DECLARATION_TYPE_REFERENCE)) {
            args.add(SearchMessages.MatchLocations_imports_description);
        }
        if (isSet(locations, IJavaSearchConstants.SUPERTYPE_TYPE_REFERENCE)) {
            args.add(SearchMessages.MatchLocations_super_types_description);
        }
        if (isSet(locations, IJavaSearchConstants.ANNOTATION_TYPE_REFERENCE)) {
            args.add(SearchMessages.MatchLocations_annotations_description);
        }
        if (isSet(locations, IJavaSearchConstants.FIELD_DECLARATION_TYPE_REFERENCE)) {
            args.add(SearchMessages.MatchLocations_field_types_description);
        }
        if (isSet(locations, IJavaSearchConstants.LOCAL_VARIABLE_DECLARATION_TYPE_REFERENCE)) {
            args.add(SearchMessages.MatchLocations_local_types_description);
        }
        if (isSet(locations, IJavaSearchConstants.RETURN_TYPE_REFERENCE)) {
            args.add(SearchMessages.MatchLocations_method_types_description);
        }
        if (isSet(locations, IJavaSearchConstants.PARAMETER_DECLARATION_TYPE_REFERENCE)) {
            args.add(SearchMessages.MatchLocations_parameter_types_description);
        }
        if (isSet(locations, IJavaSearchConstants.THROWS_CLAUSE_TYPE_REFERENCE)) {
            args.add(SearchMessages.MatchLocations_thrown_exceptions_description);
        }
        if (isSet(locations, IJavaSearchConstants.TYPE_VARIABLE_BOUND_TYPE_REFERENCE)) {
            args.add(SearchMessages.MatchLocations_type_parameter_bounds_description);
        }
        if (isSet(locations, IJavaSearchConstants.WILDCARD_BOUND_TYPE_REFERENCE)) {
            args.add(SearchMessages.MatchLocations_wildcard_bounds_description);
        }
        if (isSet(locations, IJavaSearchConstants.INSTANCEOF_TYPE_REFERENCE)) {
            args.add(SearchMessages.MatchLocations_instanceof_description);
        }
        if (isSet(locations, IJavaSearchConstants.TYPE_ARGUMENT_TYPE_REFERENCE)) {
            args.add(SearchMessages.MatchLocations_type_arguments_description);
        }
        if (isSet(locations, IJavaSearchConstants.CAST_TYPE_REFERENCE)) {
            args.add(SearchMessages.MatchLocations_casts_description);
        }
        if (isSet(locations, IJavaSearchConstants.CATCH_TYPE_REFERENCE)) {
            args.add(SearchMessages.MatchLocations_catch_clauses_description);
        }
        if (isSet(locations, IJavaSearchConstants.CLASS_INSTANCE_CREATION_TYPE_REFERENCE)) {
            args.add(SearchMessages.MatchLocations_class_instance_description);
        }
        if (isSet(locations, IJavaSearchConstants.SUPER_REFERENCE)) {
            args.add(SearchMessages.MatchLocations_super_description);
        }
        if (isSet(locations, IJavaSearchConstants.QUALIFIED_REFERENCE)) {
            args.add(SearchMessages.MatchLocations_qualified_description);
        }
        if (isSet(locations, IJavaSearchConstants.METHOD_REFERENCE_EXPRESSION)) {
            args.add(SearchMessages.MatchLocations_method_reference_description);
        }
        if (isSet(locations, IJavaSearchConstants.THIS_REFERENCE)) {
            args.add(SearchMessages.MatchLocations_this_description);
        }
        if (isSet(locations, IJavaSearchConstants.IMPLICIT_THIS_REFERENCE)) {
            args.add(SearchMessages.MatchLocations_implicit_this_description);
        }
        if (args.size() == 1) {
            return args.get(0);
        }
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < args.size(); i++) {
            if (i > 0) {
                buf.append(JavaElementLabels.COMMA_STRING);
            }
            buf.append(args.get(i));
        }
        return buf.toString();
    }

    private static boolean isSet(int flags, int flag) {
        return (flags & flag) != 0;
    }

    public static int getTotalNumberOfSettings(int searchFor) {
        if (searchFor == IJavaSearchConstants.TYPE) {
            return 15;
        } else if (searchFor == IJavaSearchConstants.CONSTRUCTOR) {
            return 1;
        } else if (searchFor == IJavaSearchConstants.METHOD) {
            return 5;
        } else if (searchFor == IJavaSearchConstants.FIELD) {
            return 4;
        }
        return 0;
    }

    public static int getNumberOfSelectedSettings(int locations, int searchFor) {
        int count = 0;
        if (searchFor == IJavaSearchConstants.TYPE) {

            if (isSet(locations, IJavaSearchConstants.IMPORT_DECLARATION_TYPE_REFERENCE)) {
                count++;
            }
            if (isSet(locations, IJavaSearchConstants.SUPERTYPE_TYPE_REFERENCE)) {
                count++;
            }
            if (isSet(locations, IJavaSearchConstants.ANNOTATION_TYPE_REFERENCE)) {
                count++;
            }
            if (isSet(locations, IJavaSearchConstants.FIELD_DECLARATION_TYPE_REFERENCE)) {
                count++;
            }
            if (isSet(locations, IJavaSearchConstants.LOCAL_VARIABLE_DECLARATION_TYPE_REFERENCE)) {
                count++;
            }
            if (isSet(locations, IJavaSearchConstants.RETURN_TYPE_REFERENCE)) {
                count++;
            }
            if (isSet(locations, IJavaSearchConstants.PARAMETER_DECLARATION_TYPE_REFERENCE)) {
                count++;
            }
            if (isSet(locations, IJavaSearchConstants.THROWS_CLAUSE_TYPE_REFERENCE)) {
                count++;
            }
            if (isSet(locations, IJavaSearchConstants.TYPE_VARIABLE_BOUND_TYPE_REFERENCE)) {
                count++;
            }
            if (isSet(locations, IJavaSearchConstants.WILDCARD_BOUND_TYPE_REFERENCE)) {
                count++;
            }
            if (isSet(locations, IJavaSearchConstants.INSTANCEOF_TYPE_REFERENCE)) {
                count++;
            }
            if (isSet(locations, IJavaSearchConstants.TYPE_ARGUMENT_TYPE_REFERENCE)) {
                count++;
            }
            if (isSet(locations, IJavaSearchConstants.CAST_TYPE_REFERENCE)) {
                count++;
            }
            if (isSet(locations, IJavaSearchConstants.CATCH_TYPE_REFERENCE)) {
                count++;
            }
            if (isSet(locations, IJavaSearchConstants.CLASS_INSTANCE_CREATION_TYPE_REFERENCE)) {
                count++;
            }
        } else if (searchFor == IJavaSearchConstants.METHOD || searchFor == IJavaSearchConstants.FIELD) {
            if (isSet(locations, IJavaSearchConstants.SUPER_REFERENCE)) {
                count++;
            }
            if (isSet(locations, IJavaSearchConstants.QUALIFIED_REFERENCE)) {
                count++;
            }
            if (isSet(locations, IJavaSearchConstants.THIS_REFERENCE)) {
                count++;
            }
            if (isSet(locations, IJavaSearchConstants.IMPLICIT_THIS_REFERENCE)) {
                count++;
            }
        }
        if (searchFor == IJavaSearchConstants.METHOD || searchFor == IJavaSearchConstants.CONSTRUCTOR) {
            if (isSet(locations, IJavaSearchConstants.METHOD_REFERENCE_EXPRESSION)) {
                count++;
            }
        }
        return count;
    }
}
